﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Calculator.ConsoleCalc;

namespace Calculator
{
    class ConsoleCalculator
    {
        readonly IValidator _validator;
        readonly IParser _parser;
        readonly IExpressionCalculator _calc;

        public ConsoleCalculator(IParser parser, IExpressionCalculator calc, IValidator validator)
        {
            _validator = validator;
            _parser = parser;
            _calc = calc;
        }

        public string Calculate(String argument)
        {
            _validator.Validate(argument);

            string result;
            if (_validator.isValid)
            {
                argument = _validator.ValidString;
                try
                {
					if (_validator.isNumber)
						result = argument;
					else
						result = CalculateToDouble(argument).ToString();
                }
                catch (DivideByZeroException)
                {
                    result = "Нельзя делить на ноль :(";
                }
                catch (ParserException)
                {
                    result = "Не удалось разобрать выражение :(";
                }
                catch (Exception)
                {
                    result = "Не удалось разобрать выражение :(";
                }
            }
            else
                result = "Не верно введено выражение";

            return result;
        }

        public double CalculateToDouble(String argument)
        {
            _parser.ParseExpression(argument);
            Expression next = _parser.GetNextExpression();
            Double result = 0;

            try
            {
                while (next.Function != FunctionType.Unknown)
                {
                    result = _calc.Calculate(next);
                    _parser.SetReturnResult(result);
                    next = _parser.GetNextExpression();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return result;
        }




    }
}
